<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'ExceptionDAO.php';
include_once 'util/MapError.php';
include_once 'TOAcao.php';

/**
 * DAO para operações de banco para ação
 * 
 * @author Douglas Rafael
 */
class DAOAcao extends CI_Model {
    
    /**
     * Lista todas as ações cadastradas
     * 
     * @return array TOAcao         Array de objetos
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function select_all_actios() {
        try {
            $result = $this->db->get('acao');

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar listar as ações.');
            } else {
                $acoes = array();
                foreach ($result->result() as $value) {
                    $acao = new TOAcao();
                    $acao->id = $value->id;
                    $acao->nome = $value->nome;
                    $acao->descricao = $value->descricao;
                    
                    array_push($acoes, $acao);
                }
                return $acoes;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }

    /**
     * Retorna o Total geral ações cadastradas.
     * 
     * @return int Total de resgistros
     */
    public function amount_all_actions() {
        return $this->db->count_all_results('acao');
    }
    
    /**
     * Seleciona uma ação de acordo com seu id
     * 
     * @param TOAcao $acao      Obejto Ação contendo o id
     * @return TOAcao           Obejto Ação selecionado
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function get_action(TOAcao $acao) {
        try {
            $this->db->where("id", $acao->id);
            $result = $this->db->get('acao');

            //Caso ocorra erro no select
            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar selecionar ação.');
            } else {
                $value = $result->row();

                $acao = new TOAcao();
                $acao->id = $value->id;
                $acao->nome = $value->nome;
                $acao->descricao = $value->descricao;

                return $acao;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    /**
     * Lista todas as ações pertencentes ao grupo.
     * 
     * @param int $codigo_group     id do grupo afim de selcionar as acoes
     * @return array TOAcao         Obejto de array contendo as ações do grupo    
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function get_action_group($codigo_group) {
        try {
            $this->db->select('acao.id AS id_acao, acao.nome AS nome_acao, acao.descricao AS acao_descricao');
            $this->db->join('acao', 'acao.id = acao_has_grupo.acao_id');
            $this->db->join('grupo', 'grupo.id = acao_has_grupo.grupo_id');
            $this->db->where('grupo.id', $codigo_group);
            $result = $this->db->get('acao_has_grupo');

            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar listar ações do grupo.');
            } else {
                $acoes = array();
                foreach ($result->result() as $value) {
                    $acao = new TOAcao();
                    $acao->id = $value->id_acao;
                    $acao->nome = $value->nome_acao;
                    $acao->descricao = $value->acao_descricao;
                    array_push($acoes, $acao);
                }
                return $acoes;
            }
        } catch (ExceptionDAO $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    /**
     * Insere as açõed do grupo
     * 
     * @param  TOGrupo $grupo   Objeto grupo contendo as ações
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function insert_action_group(TOGrupo $grupo) {
        try {
            $grupos = array();
            foreach ($grupo->acoes as $value) {
                $data['acao_id'] = $value->id;
                $data['grupo_id'] = $grupo->id;
                array_push($grupos, $data);
            }
            $result = $this->db->insert_batch('acao_has_grupo', $grupos);

            $this->db->trans_complete();

            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar inserir as ações do grupo.');
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
    
    /**
     * Atualiza as ações do grupo
     * - 1° As Ações desse grupo já cadastradas são apagadas, e depois inseridas as novas
     */
    public function update_action_group(TOGrupo $grupo) {
        $this->delete_action_group($grupo->id) ? $this->insert_action_group($grupo) : '';
    }
    
    
    /**
     * Remove as ações do grupo de acordo com seu id
     * 
     * @param  $codigo_group    Código do usuário
     * @throws ExceptionDAO
     * @throws Exception
     */
    public function delete_action_group($codigo_group) {
        try {
            $this->db->where('grupo_id', $codigo_group);
            $result = $this->db->delete('acao_has_grupo');

            if (!$result) {
                throw new Exception('Ocorreu um erro de banco de dados ao tentar remover as ações do grupo.');
            } else {
                return TRUE;
            }
        } catch (Exception $e) {
            throw new ExceptionDAO($e->getMessage());
        }
    }
    
}